package com.test.excelservice.generateor;

import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.JavaFile;
import com.squareup.javapoet.TypeSpec;
import com.test.excelservice.model.GeneInfo;
import com.test.excelservice.model.ReqParam;
import com.test.excelservice.model.ResParam;
import com.test.excelservice.util.StringUtils;

import javax.lang.model.element.Modifier;
import java.io.File;
import java.io.IOException;
import java.util.*;

/**
 * 生成接口工具类
 * @Author shilei
 */
public class GeneratorUtils {


     // 请求前缀
    public static final String RQ_PREFIX = "RQ_";

    // 响应前缀
    public static final String RS_PREFIX = "RS_";

    // 下划线
    public static final String UNDERLINE = "_";

    /**
     * 生成接口工具类
     */
    public static  void  generatorInterFace(GeneInfo geneInfo, List<ReqParam> reqParams, List<ResParam> resParams) throws IOException {

        HashMap<String, List<FieldSpec>> filedHashMap = generatorFiled(reqParams, resParams,geneInfo);


        Iterator<Map.Entry<String, List<FieldSpec>>> iterator = filedHashMap.entrySet().iterator();

        while (iterator.hasNext()){
            Map.Entry<String, List<FieldSpec>> next = iterator.next();

            TypeSpec builder = TypeSpec.interfaceBuilder(next.getKey()).addFields(next.getValue()).build();
            JavaFile file = JavaFile.builder(geneInfo.getPackageName(), builder)
                    .indent("    ")
                    .build();
            File dirFile = new File(geneInfo.getDirPath());
            if (!dirFile.getParentFile().exists()) {
                dirFile.getParentFile().mkdirs();
            }
            file.writeTo(dirFile);

        }
    }


    /**
     * 生成属性列表
     */

    public static HashMap<String,List<FieldSpec>> generatorFiled(List<ReqParam> reqParams, List<ResParam> resParams,GeneInfo geneInfo){
        // 最终结果
        HashMap<String,List<FieldSpec>> result = new HashMap<>();
        // 请求字段列表
        List<FieldSpec> reqFiledList = new ArrayList<>();
        // 响应字段列表
        List<FieldSpec> resFiledList = new ArrayList<>();
        // 处理之后的请求参数
        List<ReqParam> reqParamResult =new ArrayList<>();
        // 处理之后的响应参数
        List<ResParam> resParamResult =new ArrayList<>();

        for (ReqParam reqParam : reqParams) {
            // 响应报文加请求
            ResParam resParam = new ResParam();
            resParam.setFiledName(RQ_PREFIX+reqParam.getFiledName());
            resParam.setFiledDesc(reqParam.getFiledDesc());
            resParamResult.add(resParam);
            // 请求报文加前缀
            reqParam.setFiledName(RQ_PREFIX+reqParam.getFiledName());
            reqParamResult.add(reqParam);


        }
        for (ResParam resParam : resParams) {
            // 请求报文加响应
            ReqParam reqParam = new ReqParam();
            reqParam.setFiledName(RS_PREFIX+resParam.getFiledName());
            reqParam.setFiledDesc(resParam.getFiledDesc());
            reqParamResult.add(reqParam);
            // 响应报文加前缀
            resParam.setFiledName(RS_PREFIX+resParam.getFiledName());
            resParamResult.add(resParam);
        }

        if(StringUtils.isNotNull(reqParamResult)){
            for (ReqParam reqItem : reqParamResult) {
                FieldSpec filed = FieldSpec.builder(String.class, reqItem.getFiledName().toUpperCase())
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                        .initializer("$S",lowerFirst(removePrefix(reqItem.getFiledName())))
                        .addJavadoc(reqItem.getFiledDesc())
                        .build();
                reqFiledList.add(filed);
            }
        }

        if(StringUtils.isNotNull(resParamResult)){
            for (ResParam resItem : resParamResult) {
                FieldSpec filed = FieldSpec.builder(String.class, resItem.getFiledName().toUpperCase())
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                        .initializer("$S",upperFirst(removePrefix(resItem.getFiledName())))
                        .addJavadoc(resItem.getFiledDesc())
                        .build();
                resFiledList.add(filed);
            }
        }

        result.put(geneInfo.getClientInterFaceName(),reqFiledList);
        result.put(geneInfo.getServerInterFaceName(),resFiledList);

        return result;
    }


    /**
     * 去掉字符串前缀
     * @return String
     */
    public  static String removePrefix(String str) {
        if (str == null || "".equals(str)) {
            return "";
        } else {
            if (str.contains(UNDERLINE)) {
                String[] split = str.split(UNDERLINE);
                return split[1];
            }
            return str;

        }
    }

    /**
     * 首字母转小写
     * @param str
     * @return
     */
    public static String lowerFirst(String str) {
        str = Character.toLowerCase(str.charAt(0)) + str.substring(1);
        return str;
    }

    /**
     * 首字母转大写
     * @param str
     * @return
     */
    public static String upperFirst(String str) {
        str = Character.toUpperCase(str.charAt(0)) + str.substring(1);
        return str;
    }

}



